package com.nothing.emp.dao.impl;

import com.nothing.common.util.Page;
import com.nothing.emp.dao.BaseDao;
import com.nothing.emp.vo.EmpVo;
import org.hibernate.*;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

@Repository
//基础dao，封装了一系列的基础增删查改操作
public class BaseDaoImpl implements BaseDao {
    @Resource
    private SessionFactory sessionFactory;

    private Session getSession() {
        return sessionFactory.openSession();
    }

    /**
     * 查询列表(查询一个表的所有数据)  根据hql查询
     *
     * @param hql
     * @return
     */
    public List queryAllByHql(String hql) {
        Session session = getSession();
        List list=session.createQuery(hql).list();
        session.close();
        return list;
    }

    //HQL分页
    @Override
    public List queryByPage(String hql, Page page) {
        Session session = getSession();
        Query query =session.createQuery(hql);
        //设置记录开始位置  默认下标是从0开始
        query.setFirstResult( (page.getPage() - 1) * page.getLimit());
        //设置要查询的最大记录数量
        query.setMaxResults(page.getLimit());
        List list = query.list();
        session.close();
        return list;
    }

    //统计记录总数
    @Override
    public Integer queryCount(Class clazz) {
        //1.打开会话
        Session session = sessionFactory.openSession();
        //2.创建QBC查询条件筛选器
        Criteria criteria = session.createCriteria(clazz);
        //加入去重统计 ,加入统计函数后，查询列表得到的结果就是一个固定的统计函数值
        criteria.setProjection(Projections.rowCount());
        int count = Integer.valueOf(criteria.uniqueResult().toString());
        //.关闭会话
        session.flush();
        session.close();
        return count;
    }

    //删除方法
    @Override
    public boolean delete(Object obj) {
        boolean result = false;
        try{
            //1.打开会话
            Session session = sessionFactory.openSession();
            session.delete(obj);
            //.关闭会话
            session.flush();
            session.close();
            result = true;
        }catch (Exception e){
            e.printStackTrace();
            result = false;
        }
        return result;
    }

    @Override
    public List queryByQbc(Page page, Map params) {
        //1.打开会话
        Session session = sessionFactory.openSession();

        Criteria criteria = session.createCriteria(EmpVo.class);

        //根据参数设置查询筛选条件
        //判断是否有员工姓名限制
        if(params.get("eName") != null && !"".equals(params.get("eName"))){
            criteria.add(Restrictions.like("eName", "%" + params.get("eName").toString() + "%"));
        }
        //判断是否有工作岗位限制
        if(params.get("job") != null && !"".equals(params.get("job"))){
            criteria.add(Restrictions.like("job","%" + params.get("job").toString() + "%"));
        }


        List list = criteria.list();
        //.关闭会话
        session.flush();
        session.close();

        return list;
    }


    //根据SQL查询  *******
    @Override
    public List<Map> queryBySql(String sql, Page page) {
        //1.打开会话
        Session session = sessionFactory.openSession();
        //SQLQuery对象，可以执行普通的SQL语句
        SQLQuery sqlQuery = session.createSQLQuery(sql);
        sqlQuery.setFirstResult((page.getPage() - 1) * page.getLimit());
        sqlQuery.setMaxResults(page.getLimit());
        //设置将结果集中的每个对象，转换成Map
        sqlQuery.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
        List<Map> list = sqlQuery.list();
        //.关闭会话
        session.flush();
        session.close();
        return list;
    }

    @Override
    public boolean save(Object obj) {
        try{
            Session session = getSession();
            session.save(obj);
            session.flush();
            session.close();
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
        return true;
    }

    //根据ID查找对象
    @Override
    public Object queryById(Integer id, Class clazz) {
        Session session = sessionFactory.openSession();
        Object obj = session.get(clazz,id);
        session.close();
        return obj;
    }


    //根据SQL语句，进行查询，所得的结果集组装成List<Map>的格式，返回
    @Override
    public List queryBySql(String sql) {
        //1.打开会话
        Session session = sessionFactory.openSession();
        //SQLQuery对象，可以执行普通的SQL语句
        SQLQuery sqlQuery = session.createSQLQuery(sql);
        //设置将结果集中的每一行数据，转换成Map
        sqlQuery.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
        List<Map> list = sqlQuery.list();
        //.关闭会话
        session.flush();
        session.close();
        return list;
    }


}
